问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

windows 进程管理源代码详解,要详细的,

发布网友 发布时间:2022-04-23 06:25

我来回答

1个回答

热心网友 时间:2023-08-26 07:38

Windows 是闭源开发的商业软件,受商业版权法保护,别说大家都没有,就算有也不能给你的(被微软起诉那可不是小事)。

Linux的是开源的,干嘛不去读Linux源码呢?

新版本的太长,写不开,给你最经典的0.11版的进程管理源码。其他的你自己去查。作为一个好的程序员,必须学会充分利用搜索引擎。

---------------------------------------

linux0.11通过一个进程数组管理进程,最大允许64个进程存在。进程的状态有就绪态,运行态,暂停态,睡眠态和僵死态等。睡眠态又可分为可中断和不可中断两种。对于进程的管理,我觉得按照进程的状态来讲会清晰一些。
1.0号任务
0号比较特殊,是"纯手工制作",下面就是制作过程
mem_init(main_memory_start,memory_end);
trap_init();
blk_dev_init();
char_dev_init();
tty_init();
time_init();
sched_init();
buffer_init(buffer_memory_end);
hd_init();
floppy_init();
sti();
move_to_user_mode();
这么多init当然不全是为0任务准备的,他们是初始化系统。对任务0来说,重要的是sched_init()和move_to_user_mode()两个。sched_init()中手动设置了任务0的任务段描述符tss和局部段描述符ldt,并设置了tr和ldtr寄存器:
set_tss_desc(gdt+FIRST_TSS_ENTRY,&(init_task.task.tss)); //设置tss段描述符
set_ldt_desc(gdt+FIRST_LDT_ENTRY,&(init_task.task.ldt));//设置ldt描述符
...
ltr(0); //加载tss描述符地址到tr
lldt(0); //加载ldt描述符地址到ldtr

我们来看一下任务0的tss和ldt是什么样子
/*ldt*/ {0,0},\
{0x9f,0xc0fa00},\
{0x9f,0xc0f200},\
/*tss*/{0,PAGE_SIZE+(long)&init_task,0x10,0,0,0,0,(long)&pg_dir,\
0,0,0,0,0,0,0,0,\
0,0,0x17,0x17,0x17,0x17,0x17,0x17,\
_LDT(0),0X80000000,\
{}\
},\
从ldt 可以看到,任务的代码和数据段均为640k,基址为0,DPL=3。这说明虽然任务0的代码还是处在内核段内,但是任务的级别已经是用户态了。从tss也可以看到这一点,代码和数据都被置为0x17,也就是局部段描述符表第2项。还可以看到任务0的内核太堆栈被设置在init_task之后的一页处,用户态堆栈就是move_to_user_mode之前的内核态堆栈。这和普通进程不一样,普通进程的用户态堆栈在其64Mb地址空间的末端。
move_to_user_mode是在堆栈中创建一个任务切换的假象,用iret跳转到外层3,这样cpu就会自动根据tr加载tss,并初始化各个寄存器运行任务0。所以,任务0其实就是内核空间中的用户态任务。
2.进程的创建
进程创建是由系统调用sys_fork完成的,主要使用了两个函数find_empty_process和copy_process。前者在进程在进程数组中找一个不用的进程号给子进程,后者完成子进程信息的创建,主要是复制父进程的信息。
我们来看一下copy_process的代码:
int copy_process(int nr,long ebp,long edi,long esi,long gs,long none,
long ebx,long ecx,long edx,long fs,long es,long ds,
long eip,long cs,long eflags,long esp,long ss)
{
struct task_struct *p;
int i;
struct file *f;
//首先为子进程的进程描述符分配一块内存
p=(struct task_struct *)get_free_page();
if(!p)
return -EAGAIN;
//将新任务结构指针加入数组中
task[nr]=p;
//复制当前用户的任务结构到子进程中。当然堆栈不复制
*p=*current;
//将子进程的状态设为不可中断等待,防止现在被调度
p->state=TASK_UNINTERRUPTIBLE;
P->pid=last_pid;
p->father=current->pid;
p->count=p->priority;
p->signal=0;
p->alarm=0;
p->leader=0;
p->utime=p->stime=0;
p->cutime=p->cstime=0;
p->start_time=jiffies;
p->tss.back_link=0;
//新进程的内核态堆栈在进程描述符页末端
p->tss.esp0=PAGE_SIZE+(long)p;
P->tss.ss0=0x10;
//ip为父进程调用fork的下一条指令
p->tss.eip=eip;
//fork的返回值对子进程来说是0,对父进程来说是它的pid,通过这个区别,在fork调用返回后,父子进程的代码段便被分割来,
p->tss.eax=0;
//虽然他们是在一个代码文件中写的
p->tss.ecx=ecx;
p->tss.edx=edx;
p->tss.ebx=ebx;
p->tss.esp=esp;
p->tss.ebp=ebp;
p->tss.esi=esi;
p->tss.edi=edi;
p->tss.es=es&0xffff;
p->tss.cs=cs&0xffff;
p->tss.ss=ss&0xffff;
p->tss.ds=ds&0xffff;
p->tss.fs=fs&0xffff;
p->tss.gs=gs&0xffff;
p->tss.ldt=_LDT(nr);
p->tss.trace_bitmap=0x80000000;
//如果父任务使用了协处理器,还要保存到tss中
if(last_task_used_math==current)
_asm("clts;fnsave %0"::"m"(p->tss.i387));
//为新任务设置新的代码和数据段基地址。注意,因为linux0.11只支持64M的进程空间,所以进程的线性地址空间在64M的边界处。
//然后为新任务复制父进程的页表。通过copy_page_tales,父子任务此时共用一个只读的代码数据段。在写操作时,写时复制会为新进程申请新的物理页面。
if(copy_mem(nr,p)){
task[nr]=NULL;
free_page((long)p);
return -EAGAIN;
}
for(i=0;i<NR_OPEN;i++)
if(f=p->filp)
f->f_count++;
if(current->pwd)
current->pwd->i_count++;
if(current->root)
current->root->i_count++;
if(current->executable)
current->executable->i_count++;
//设置新任务的tss和ldt描述符
set_tss_desc(gdt+(nr<<1)+FIRST_TSS_ENTRY,&(p->tss));
set_ldt_desc(gdt+(nr<<1)+FIRST_LDT_ENTRY,&(p->ldt));
//返回子进程的pid
return last_pid;
}
参数都是堆栈中的值,nr是调用copy_process之前的find_empty_process的返回值,作为任务数组的序号。
3.进程的调度
进程创建之后并不是立即执行。系统会在适当的时刻调用系统调度函数schele,它会选择适当的进程运行。调度函数可能在系统调用结束之后,进程暂停/ 睡眠/退出,时钟中断等多个地方调用。调度函数主要是通过进程的时间片来选择一个运行时间最短的进程运行。如果没有找到就运行空闲pause系统调用,在 Pause中,调度函数又会被调用。下面是主要代码
while(1){
c=-1;
next=0;
i=NR_TASKS;
p=&task[NR_TASKS];
//寻找就绪任务中运行时间最短的任务
while(--i){
if(!(*--p))
continue;
if((*p)->state==TASK_RUNNING&&(*p)->counter>c)
c=(*p)->counter,next=i;
}
//如果找到,就退出。否则重新计算任务的时间片。注意,如果没有任务,next始终为0,结果就被切换到任务0
if(c)break;
for(p=&LAST_TASK;p>&FIRST_TASK;--p)
if(*p)
(*p)->counter=((*p)->counter>>1)+(*)->priority;
}
switch_to(next);//通过长跳转,转换任务到新任务。
}
时钟中断是执行调度的重要措施,正是由于不断的执行调度,系统才能在多个任务之间进行切换,完成多任务操作系统的目标。在调度器初始化时,除了手动设置了任务0,还对8253开启了定时器中断,对系统"点火".中断中调用了do_timer函数。现在这是个很短的函数:
void do_timer(long cpl)
{
...
//根据优先级调整进程运行时间
if(cpl)
current->utime++;
else
current->stime++;
//处理定时器中断队列
if(next_timer){
next_timer->jiffies--;
while(next_timer&&next_timer->jiffies<=0){
void(*fn)(void);
fn=next_timer->fn;
next_timer->fn=NULL;
next_timer=next_timer->next;
(fn)();
}
}
..
//对进程时间片减1。如果大于0 ,表示时间片还没有用完,继续
if((--current->counter>0)return;
//注意,内核态任务是不可抢占的,在0.11中,除非内核任务主动放弃处理器,它将一直运行。
if(!cpl)return;
//调度
schele();
}
4.进程的终止
进程可以自己中止,也可以被中止信号中止。do_exit执行退出。如果它有子进程的话,子进程就会成为孤儿进程,这里会将它的孩子托付给进程1(即init进程)管理。在成为僵死进程之后,还要通知父进程,因为他的父进程可能在等它呢。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
贸然的打扰什么意思 打扰您了的短语 贸然打扰什么意思 选择条纹T 恤搭配高腰长款西装阔腿裤时,需要注意什么? 蓝白条纹连衣裙上用84洗染成了红色,请问有什么方法可以洗掉吗?注意... 蓝白条纹的纯棉的T恤染上几点红色,该怎么洗?? 2022年卡塔尔世界杯乌拉圭vs韩国谁会赢 乌拉圭vs韩国比赛结果预测_百度... 经济制度在经济体制改革和经济发展中的影响 我国基本经济制度起到了什么作用 我国基本经济制度作用简述 本人在计划生育的时候放环到现在已有10年了,也没感觉什么的,要取出来吗... 单相智能电能表里的载波模块插上没通讯是什么问题? 怎样从外表看出一个女人是否是处女? 设计版权需登记吗 有没有基于Microsoft Word&#47;Excel内容的版本管理工具?就像SVN、Git这样。 设计作品版权登记需要准备哪些材料? 电力载波通信模块BWP10(深圳必威尔科技)的核心模块是什么?急求 iphone6s屏幕中间出现一条线是什么原因? 三一重工是做什么的? Microsoft Visual SourceSafe是什么? 从腿型怎么看处女。知道的告诉一下,最好有好几张图片做对比 三一重工基本情况分析 Visual Studio 2008正式版内包含有Visual SourceSafe(源代码管理器)吗? 花甲怎么快速去沙? 别人说从女生后面看双腿是直的就是处 弯的不是处 是真是假?! vivo X9手机屏幕中间有一条线是怎么回事,如何解决? 从腿型上怎么判断一个女的不是处女 QPSK调制解调原理 在WINDOWS 7中怎样在在源代码中加入让程序以管理员身份权限运行的语句? VS2008安装后,启动时提示初始化 Microsoft Visual SourceSafe 源代码管理提供程序时失败。 怎么看出来是不是处子之身 360工具栏和标题栏字体大小怎么设置呀? 建筑设计作品如何办理版权登记 请问无线通信中载波冲突问题是怎么回事 怎样从外表看出她是处与非处 建筑设计作品如何版权登记 设计作品版权备案登记有哪些方式? 手机发送信号工作原理 三一重工是干啥的? windows操作系统源代码 可以看女性叉腿的程度来判断是不是处 产品设计图纸怎么登记版权? 怎样改360浏览器顶部菜单的那些字体 电力线载波通信,我想做一个电力线载波实现数字语音通信 应该使用什么芯片 或者 有什么能买到的模块 花甲有沙洗不干净,如何让快速花甲吐沙? 如何:向源代码管理添加项目或解决方案 微软的源代码是什么意思、? 为什么设计作品要进行版权登记? 语音验证码安全吗。刚刚才接受了一个,是打电话过来说验证码是多少。 是什么原因导致微软科技公司源代码泄露的? 如何进行版权登记,多久可以拿到登记证?
  • 焦点

最新推荐

猜你喜欢

热门推荐