操作系统与C语言
操作系统五态
程序的一次执行 执行叫做一个进程 : 不是一次执行完 停停走走
(就绪态)改变优先级 调度仍然认为是随机的 随机分配20-200ms的数据 程序交替执行 4条脉冲一个指令 2g/4 = 50000000条
(运行态)
(阻塞态I/O输入)
(睡眠态可以自己醒来)
(挂起态 没有恢复原语 一直死 睡眠可以自己起来 挂机不能自然醒来)
线程 迁程 携程
线程
是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
一个进程可以有很多线程,每条线程并行执行不同的任务
迁程
纤程本质上也是线程,是多任务系统的一部分,纤程为一个线程准并行方式调用多个不同函数提供了一种可能,它本身可以作为一种轻量级的线程使用。
它与线程在本质上没有区别,它也有上下文环境,纤程的上下文环境也是一组寄存器和调用堆栈。它是比线程更小的调度单位。注意一般我们认为线程是操作系统调用的最小单位,而纤程相比于线程来说更小。
但是它是有程序员自己调用,而不由操作系统调用。系统在调度线程的时候会陷入到内核态,线程对象本身也是一种内核对象,而纤程完全是建立在用户层上,它不是内核对象也没有对象的句柄。
通过纤程的机制实际就绕开了Windows的随机调度线程执行的行为,调度算法由应用程序自己实现,这对一些并行算法非常有意义。因为纤程和线程本质上的类同性,所以也要按照理解线程为函数调用器的方式来理解纤程
协程 用户态的轻量级的非抢占式的线程
--优点:协程切换的时候开销小,用户态且轻量
非抢占式,不用加很多锁,减小复杂度,不用很复杂的处理线程同步问题
--缺点:协程不能利用多核,只能使用单核,因为同时只有一个协程在运行
getch getchar 和kbhit
ESC的ASCII码的值为27 取消
getch() 屏幕看不到 放到缓冲区中 卡住 提取一个输入一个
getch()是编程中所用的函数,这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,但是这个函数并非标准函数,要注意移植性
头文件 conio.h
getchar() 屏幕能看到 放到缓冲区 当用户输入回车后 一次提取一个
其他字符会保留在键盘缓存区中,等待后续getchar调用读取。
也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键
getchar() 是读入函数的一种。它从标准输入里读取下一个字符,相当于
getc(stdin)。返回类型为int型,为用户输入的ASCII码或EOF。
头文件 stdio,h
kbhit()功能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
c++头文件:conio.h
I/O中一次给getchar/getch一位
kbhit虚拟多线程
牺牲时间带来速度
到底用哪个