用信号量描述象棋的活动执行职位描述

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 134, 距离下一级还需 66 积分
论坛徽章:0
本帖最后由 Huntsmen 于
16:13 编辑
假设是UP系统,有2个进程A和B,B的优先级比A的高,但是B因为在等待信号量,所以处于pending状态,进程A有机会执行;
当进程A发送B正在等待的信号量时,B是会被立即唤醒执行,还是需要等A的时间片用完了才可以有机会调度B?
即下面的例子,当进程A发送了信号量之后,是会接着执行operation A-2呢 ?还是先执行operation B-2?
operation A-1;
发送信号量;
operation A-2;
operation B-1;
等待信号量;
operation B-2;
这个是不是要分内核是可抢占和非抢占的,
对于可抢占的,发送信号量之后,就会有一个调度点,所以进程B被唤醒,然后先执行operation B-2;
对于非可抢占的,发送信号量之后,内核只是标记进程B为就绪态,只有等进程A的时间片用完,或者主动释放cpu之后,进程b才能执行;所以这里是先执行operation A-2;
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
家境小康, 积分 1027, 距离下一级还需 973 积分
论坛徽章:7
应该是等a执行完了之后吧,a发送信号量给B只是把B执行状态转为可运行状态,只有等到进程调度时才会切到B中。。。。个人理解,欢迎拍砖。
论坛徽章:6
send_signal---&__send_signal---&wake_up_state
从这个流程来看,发送完信号后,只是将目标进程放到可调度队列,并不会马上调度目标进程。
小富即安, 积分 3192, 距离下一级还需 1808 积分
论坛徽章:4
对于实时系统来说,都是内核可抢占的,所以一般来说,信号量的唤醒必然导致高优先级任务的调度。
对于非实时系统来说,不管是否开启内核抢占,都不能保证这一点。
只是开启内核可抢占的情况下,不管进程处于内核态或是应用态,时间片用完都会被抢占,关闭内核抢占的则是必须返回到应用态的时候才会被抢占。
家境小康, 积分 1154, 距离下一级还需 846 积分
论坛徽章:0
b如果打算立即被调度,要a手动schedue调度)
白手起家, 积分 134, 距离下一级还需 66 积分
论坛徽章:0
谢谢回复!
还想请教几个问题:
1,假如是关闭内核抢占的,那么是在返回用户态时就被抢占了,还是说返回用户态后也要等时间片用完了才能被抢占?
2,如果是2个内核线程,它们没有用户态,它们之间是如何抢占的呢?
3,内核代码什么地方可以查看系统调度的时间片长度是多少?
小富即安, 积分 3192, 距离下一级还需 1808 积分
论坛徽章:4
从我所能看到的:
1,等时间片,时间片用完触发调度。
2,主动放弃
3,HZ这个宏
巨富豪门, 积分 22811, 距离下一级还需 17189 积分
论坛徽章:15
释放信号量后,只是唤醒等待进程,使其进入可运行队列,具体调度时机取决于调度器和是否支持抢占。
富足长乐, 积分 7205, 距离下一级还需 795 积分
论坛徽章:1
取决于send signal是如何实现的。
调度器总是发生在从中断/软中断/系统调用上下文返回内时候(不管返回内核态,还是用户态)。
如果send signal函数是通过系统调用实现的,该函数从系统调用返回时就会触发调度器重新调度。如果send signal函数没有触发主动中断/软中断/系统调用, 那就要等到下一个调度点。
曾经开发过一个powerpc下的实时操作系统,为了保证实时性,所有可能改变进程优先级的事件都同过系统调用实现:
event_post/event_pend/semphore_post/semaphore_pend 等等, 实现这些函数时, 要调用powerpc 的&sc&指令进入系统上下文,这些功能在系统上下文执行。从系统上下文返回任务上下文时,调度器就会被触发,引起进程切换。基本上这个函数一返回任务切换就发生, 保证实时性。
白手起家, 积分 134, 距离下一级还需 66 积分
论坛徽章:0
如果2个进程都是SCHED_FIFO,应该是发送信号量之后,就立即执行等待该信号的进程吧
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处博客访问: 2406150
博文数量: 409
博客积分: 10227
博客等级: 上将
技术积分: 9526
注册时间:
认证徽章:
非淡泊无以明志,非宁静无以致远
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
E.W.DijkstraDijkstra
P1V1P1PVV2DijkstraPVPprolagenproberen te verlagenVverhogenDijkstraEWD74sem_wait(3RT)sem_post(3RT)DijkstraPVsem_trywait(3RT)P
Vsem_post(3RT)go to
POSIXfork()psharedIDIDopenretrievecloseremovesem_opensem_getvaluesem_closesem_unlinksem_open
sem_init(3RT)semvalue
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem_& //sem_t
/* initialize a private semaphore */
pshared =0;
ret = sem_init(&sem, pshared, value);
psharedpshared
& 2sem_init
sem_init()
:SEM_VALUE_MAX
:SEM_NSEMS_MAX
:sem_init()
int sem_post(sem_t *sem);
ret = sem_post(&sem); /* semaphore is posted */
sem_post()
sem_wait(3RT)sem
int sem_wait(sem_t *sem);
ret = sem_wait(&sem); /* wait for semaphore */
sem_wait()
sem_trywait(3RT)sem
int sem_trywait(sem_t *sem);
ret = sem_trywait(&sem); /* try to wait for semaphore*/
sem_wait()sem_trywait()
2sem_trywait
sem_trywait()
:sem_trywait()
sem_destroy(3RT)sem
int sem_destroy(sem_t *sem);
ret = sem_destroy(&sem); /* the semaphore is destroyed */
sem_destroy
sem_destroy()
/* File sem.c */
#define MAXSTACK 100
int stack[MAXSTACK][2];
int size=0;
/* 1.dat*/
void ReadData1(void){
FILE *fp=fopen("1.dat","r");
while(!feof(fp)){
fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]);
sem_post(&sem);
fclose(fp);
void ReadData2(void){
FILE *fp=fopen("2.dat","r");
while(!feof(fp)){
fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]);
sem_post(&sem);
fclose(fp);
void HandleData1(void){
sem_wait(&sem);
printf("Plus:%d+%d=%d\n",stack[size][0],stack[size][1],
stack[size][0]+stack[size][1]);
void HandleData2(void){
sem_wait(&sem);
printf("Multiply:%d*%d=%d\n",stack[size][0],stack[size][1],
stack[size][0]*stack[size][1]);
int main(void){
pthread_t t1,t2,t3,t4;
sem_init(&sem,0,0);
pthread_create(&t1,NULL,(void *)HandleData1,NULL);
pthread_create(&t2,NULL,(void *)HandleData2,NULL);
pthread_create(&t3,NULL,(void *)ReadData1,NULL);
pthread_create(&t4,NULL,(void *)ReadData2,NULL);
pthread_join(t1,NULL);
Linuxgcc -lpthread sem.c -o semsem 1.dat2.dat1 2 3 4 5 6 7 8 9 10 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 sem
Multiply:-1*-2=2
Plus:-1+-2=-3
Multiply:9*10=90
Plus:-9+-10=-19
Multiply:-7*-8=56
Plus:-5+-6=-11
Multiply:-3*-4=12
Plus:9+10=19
Plus:7+8=15
Plus:5+6=11
阅读(6676) | 评论(0) | 转发(2) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 象棋文字描述 的文章

 

随机推荐