基础知识
时间:2009-05-15 来源:makeourfuture
异步操作(asynchronous operation):由于很多计算机系统时间会在不可预测的时间、已不可预测的顺序发生而产生的。
并发(concurrency):指相同的时间桢内对资源的共享。
通信(communication):将一个实体的信息传送给另一个实体。
多道程序设计(multiprogramming):是指有多个进程准备好要执行。操作系统挑选一个已经准备好的进程来执行。当那个进程需要等待资源时(一次按键或一次磁盘访问),操作系统保存从停止处恢复此进程所需要的所有信息,并选择另一个准备好的进程执行。这里很容易看出多道程序设计可能是如何实现的。一次资源请求(read或者write)会引起一次对操作系统的的请求(即一次系统调用)。系统调用(system call)是对操作系统服务的一次请求,它会使正常的CPU周期中断,并将控制权交给操作系统。然后,操作系统就可以切换到另一个进程上去了。
例:
解释磁盘I/O请求是怎样允许操作系统运行另一个进程的?
答案:
大多数设备都是有操作系统而不是由应用程序处理的。当一个应用程序执行读磁盘的操作时,调用向操作系统发出请求来实际执行这个操作。
现在,操作系统拥有控制权。它可以向磁盘控制器发出命令,开始根据应用程序的请求检索磁盘块。但是,由于磁盘检索在很长一段时间内都完成不了,操作系统就将应用程序进程放入一个等待I/O完成的进程队列,并启动另一个已经准备好要运行的进程。最终,磁盘I/O得到结束时,磁盘控制器会终端CPU的指令周期。那时,操作系统重新获得控制权,并且可以选择是继续运行当前的进程还是允许原来的进程运行。
侵入带来的缓冲区溢出
本节简要解释缓冲区溢出以及如何利用他来攻击计算机系统。当程序将数据拷贝到一个没有为其分配足够空间的变量中去的时候,就会发生缓冲区溢出(buffer overflow)。
下面代码有缓冲区溢出可能。
为了解决这种潜在的溢出,你首先想到的办法可能是把buf扩大一些,比如说,1000个字节。什么人的名字会有那么长呢?即使用户决定输入一个很长的字符串,除了那些最固执的用户外,1000个字节也应该够大了。但是,不论你最终选择的长度是多少,这段代码还是有可能会出现缓冲区的溢出。其实,用户只需要简单地将标准输入重新定向到一个任意大的文件就行了。
下面代码显示了解决这个问题的一种简单的办法。格式的规则将用户输入的字符串长度跟定在小于变量长度的范围内,并且为字符串结束符留有空间。程序最多向buf中读入79个字符,但在遇到空格字符的时候会听下来。如果用户的输入多余79个字符,程序会在随后的输入语句中读入额外的字符。
并发(concurrency):指相同的时间桢内对资源的共享。
通信(communication):将一个实体的信息传送给另一个实体。
多道程序设计(multiprogramming):是指有多个进程准备好要执行。操作系统挑选一个已经准备好的进程来执行。当那个进程需要等待资源时(一次按键或一次磁盘访问),操作系统保存从停止处恢复此进程所需要的所有信息,并选择另一个准备好的进程执行。这里很容易看出多道程序设计可能是如何实现的。一次资源请求(read或者write)会引起一次对操作系统的的请求(即一次系统调用)。系统调用(system call)是对操作系统服务的一次请求,它会使正常的CPU周期中断,并将控制权交给操作系统。然后,操作系统就可以切换到另一个进程上去了。
例:
解释磁盘I/O请求是怎样允许操作系统运行另一个进程的?
答案:
大多数设备都是有操作系统而不是由应用程序处理的。当一个应用程序执行读磁盘的操作时,调用向操作系统发出请求来实际执行这个操作。
现在,操作系统拥有控制权。它可以向磁盘控制器发出命令,开始根据应用程序的请求检索磁盘块。但是,由于磁盘检索在很长一段时间内都完成不了,操作系统就将应用程序进程放入一个等待I/O完成的进程队列,并启动另一个已经准备好要运行的进程。最终,磁盘I/O得到结束时,磁盘控制器会终端CPU的指令周期。那时,操作系统重新获得控制权,并且可以选择是继续运行当前的进程还是允许原来的进程运行。
侵入带来的缓冲区溢出
本节简要解释缓冲区溢出以及如何利用他来攻击计算机系统。当程序将数据拷贝到一个没有为其分配足够空间的变量中去的时候,就会发生缓冲区溢出(buffer overflow)。
下面代码有缓冲区溢出可能。
char buf[80]; printf("Enter your name:"); scanf("%s",buf); |
为了解决这种潜在的溢出,你首先想到的办法可能是把buf扩大一些,比如说,1000个字节。什么人的名字会有那么长呢?即使用户决定输入一个很长的字符串,除了那些最固执的用户外,1000个字节也应该够大了。但是,不论你最终选择的长度是多少,这段代码还是有可能会出现缓冲区的溢出。其实,用户只需要简单地将标准输入重新定向到一个任意大的文件就行了。
下面代码显示了解决这个问题的一种简单的办法。格式的规则将用户输入的字符串长度跟定在小于变量长度的范围内,并且为字符串结束符留有空间。程序最多向buf中读入79个字符,但在遇到空格字符的时候会听下来。如果用户的输入多余79个字符,程序会在随后的输入语句中读入额外的字符。
char buf[80]; printf("Enter you name:"); scanf("%79s",buf); |
相关阅读 更多 +