随笔分类 -  操作系统学习

摘要:Linux操作系统内核态对进程线程不做严格区别 从内核角度看根本就没有线程的概念,线程仅仅被视为一个使用某些共享资源的进程如地址空间,文件系统,打开的文件,信号处理程序等 进程0 内核是一个大的程序,可以控制硬件,也可以创建、运行、终止、控制所有的进程。当内核被加载到内存后,首先就会有完成内核初始化的函数start_kernel()从无到有的创建一个内核线程swap,并设置其PID为0,即进程0;它也叫闲逛进程;进程0执行的是cpu_idle()函数,该函数仅有一条hlt汇编指令,就是在系统闲置时用来降低电力的使用和减少热的产生。同时进程0的PCB叫做init_task,在很多链表中起了表头的 阅读全文
posted @ 2013-07-29 20:59 herry_tu 阅读(2960) 评论(0) 推荐(0)
摘要:在每个进程退出如调用exit或return的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等,但是进程并没有立马就消失,而是仍然为其保留一定的信息(包括进程号,退出状态,运行时间, 直到父进程通过wait/waitpid来处理时才进行释放。此时该进程处于僵尸状态,该进程成为僵死进程(Zombie Process)。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号, 那么它就一直保持僵死状态,此时即使是root用户也无法清理,如果这时父进程结束了,僵死的子进程成为"孤儿进程&quo 阅读全文
posted @ 2013-07-29 20:56 herry_tu 阅读(479) 评论(0) 推荐(0)
摘要:首先它们最终都调用了内核里的do_fork()函数,然后完成了下述操作 1、调用alloc_task_struct()函数申请8KB的内核栈内存空间,供新建进程使用; 2、让指针指向父进程的PCB,然后将父进程的PCB内容拷贝到给新进程分配的PCB中去,此时父子进程完全相同,当然拷贝内容包括了:指令,变量值,程序调用栈,缓存区,环境变量等等,而此时若搭配一些有缓存的语句,就会出现意想不到的结果了,这是后话。 3、检查创建该进程后,是否越界,即该用户所拥有的进程数目是否超过了给它分配的资源的限制; 4、然后就是建立新创建的子进程的新的,独有资源,并且通知内核此进程已经诞生。 5、设置子进程的状态 阅读全文
posted @ 2013-07-24 15:29 herry_tu 阅读(1477) 评论(0) 推荐(0)
摘要:当一个进程从用户态进入内核态,CPU自动设置该进程的内核栈,这个栈位于内核数据段上。同时,为节省空间,Linux把内核栈和一个紧挨近PCB的小数据结构thread-info放在一起,占用8KB的内存区。 在Intel系统中,栈起始于末端,并朝这个内存区开始的方向“增长”。刚切换过来,内核栈是空的,堆栈寄存器ESP直接指向此内存区的顶端。通过找到thread-info来找到当前运行的task-struct(PCB)(,那么是怎样找到的呢?下边介绍)。 但是要注意,实际上进程的PCB所占内存是由内核动态分配的,更确切的说,内核根本不给PCB分配内存,而仅仅给内核栈分配8KB的内存,并把其中的一.. 阅读全文
posted @ 2013-07-24 14:47 herry_tu 阅读(1322) 评论(0) 推荐(0)
摘要:操作系统的功能: 1 操作系统接口 2 CPU管理 3 内存管理 4 设备管理 5 文件管理 操作系统的设计采用分层结构,越是上层,越接近用户 操作系统=内核+系统程序 系统程序=编译环境+API+AUI 编译环境=编译程序+连接程序+装载程序 Linux内核是单内核结构,即把内核作为一个大整体来实现,而各模块之间可以直接调用相关函数 延迟执行机制----下半部分,软中断,Tasklet,工作队列等qsort包含在头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。 函数原型: void q... 阅读全文
posted @ 2013-07-24 14:43 herry_tu 阅读(245) 评论(0) 推荐(0)