操作系统 - 如何计算重定位中的运行时存储地址
在看CSAPP第二版的时候看到第七章,有道题的题目是 图7-10中的swap程序包含5个重定位的引用,对于每个重定位的引用,给出他们在7-10中的行数,运行时存储地址和值 在网上看到的答案是(不知道是否正确) Line # in Fig. 7.10 Address Value 15(bufp0) 0x080483CB 0x0804945c 16(buf[1]) 0x080483D0 0x08049458 18(bufp1) 0x080483D8 0x08049548 18(buf[1]) 0x080483DC 0x08049458 23(bufp1) 0x080483E7 0x08049548 书前的例子关于绝对重定位太含糊其词了,关于地址只有关于bu
158 2022-07-19
编程技术问答社区
linux - 如何理解操作系统与安装(运行)在操作系统上的软件的关系
问 题 如果将操作系统理解为一个安装在电脑上管理cpu等硬件的大型软件,那么安装(运行)在操作系统上的软件,是在操作系统的帮助下直接更改硬件状态,还是更改大软件(操作系统)的状态之后,间接对硬件进行操作? 解决方案 我觉得是第二种。 跟硬件相关的操作,通常是操作系统内核才有权限进行的,应用程序不能直接操作硬件。 以读磁盘文件为例: 应用程序进程发起read系统调用。 CPU进入内核态,执行相应的内核代码,进行读操作。 操作完成后,返回用户态,继续执行后面的代码。 个人浅见,如有错误请指正。
254 2022-07-19
编程技术问答社区
php - 升级到Ubuntu16.04后apache无法使用
问 题 我原本使用的操作系统是Ubuntu 14.04 LTS Desktop,上面安装了apache2,php5.3和mysql,后来系统提示升级到15.10,升级成功且升级过程中有询问我是否保留php等的配置文件; 之后不久又提示我升级到16.04 LTS,然后我就升了,升级成功但升级过程中并没有询问我是否保留配置文件,当时就有点纳闷。 升级完成之后,访问此服务器时没有得到任何响应,然后发现我php5没了,而且apache2启动也提示错误信息(貌似是没找到php mod) 然后我sudo apt install php libapache2-mod-php安装了php7,发现apache可以无错误启动了 然而访问此服务器还是没有响应。。。 所以现在怎么办 解决方案 我之前装16.04安装php也默认是7.. 然后我就重装系统了 最好别升级,只要升级安全类组件就好。 或者你在源码安装一次php5 随后在apache的配置文件及fpm中更改为加
222 2022-07-19
编程技术问答社区
操作系统 - 怎样让windows命令行支持utf-8字符集?
问 题 按网上的资料: 1、打开CMD.exe命令行窗口 2、通过 chcp命令改变代码页,UTF-8的代码页为65001 chcp 65001 执行该操作后,代码页就被变成UTF-8了。但是,在窗口中仍旧不能正确显示UTF-8字符。 3、修改窗口属性,改变字体 在命令行标题栏上点击右键,选择"属性"->"字体",将字体修改为True Type字体"Lucida Console",然后点击确定将属性应用到当前窗口。 操作后发现,是有部分中文可以输出,比如:我的名字 但输出:构造函数 就会出问题了。 为什么会这样? 怎样才能解决? 以前说的是运行java程序的情况,但我发现运行c程序的时候,还是一样不能显示正确中文,这又是什么原因? 解决方案 你应该是用普通的文本编辑器编写java源代码而不是eclipse吧。假设你的程序是这样的: public class HelloWorld{ public stati
316 2022-07-19
编程技术问答社区
linux - 单处理器系统的并发性问题?
问 题 因为处理请求时经常涉及可能阻塞进程的I/O操作,所以这种方法即使在单处理器系统上也能获得一定的并发性 —— 《深入理解Unix操作系统内核》 上文中提到的方法即fork() 为什么说阻塞进程的I/O操作能使得单处理器系统获得一定的并发性?意思是说当一个进程阻塞挂起后就能重新调用fork,而不阻塞就不允许吗? 解决方案 不是"阻塞导致并发性", 而是“fork使阻塞不破坏并发性" 在子进程做IO操作, 可以随便阻塞 父进程在fork()后立刻可以接受下一个请求, 即"并发"
186 2022-07-19
编程技术问答社区
linux - 如何让win10可以对大小写敏感?
问 题 例如,有a.txt。依然能够新建A.txt 解决方案 在文件系统中记录大小写,但是在用户层屏蔽掉大小写是为了方便用户体验。Mac也是类似的。这样导致Win32的注册表和程序内部有大量的大小写不同的字符串,最典型的是C:\Windows的大小写。所以你不可能把系统全部设置为大小写敏感的,那样的话很多程序都无法运行了。 ObCaseInSensitive只是影响系统内核,是在Win32层面之下的。设置了这个只有在POSIX子系统里是可以看出作用来。Windows Server和Windows 10里都有。而POSIX没有图形API,所以现在都是命令行程序或Bash下跑的程序。
388 2022-07-19
编程技术问答社区
操作系统 - 关于信息存储边界和字节对齐的疑问
问 题 就我目前理解的来说: 数据在内存中会根据字长的大小对其存储,如字长32位,则未满32位的数据会对齐填充使之达到32位,超过32位则会把超过的部分放到下一个32位中。 比如我有这样的数据: A(8字节) B(8字节) C(8字节) D(4字节) E(8字节) 那么对于字长32位的系统来说在内存中会被这样存储(下划线表示被划分在同一个32位的空间内): A B C D [字节填充] E XXXXXXXXXXXXXXX ----------------- ----------------- 而这样做的目的是读取数据的时候可以一次就读取到完整的数据,那么为什么读取的时候不能定位到需要读取的数据的起始地址呢?比如这样的排列的话(下划线表示地址上连续): A B C D E --------- 那么当要读取数据E的时候,定位到E的起始地址再读取数据,这样同样可以一次性读取到所需的数据。 我的疑惑就在于为什么读取数据的时候不定位到目标数据的起始地址再读取? 请
128 2022-07-19
编程技术问答社区
c - 子进程与父进程的地址空间?
问 题 看到过一段描述 fork()被包含在unistd.h中。这个函数不需要任何参数;它会直接创建一个新的进程,将现在运行的进程的处理器状态、地址空间直接拷贝到新进程中,因此新进程也会从fork()对应的指令开始运行。 这里提到了子进程拷贝父进程的地址空间, 但是我记得看到过每个进程的地址空间都是唯一的, 查了下, 这个链接提到 The process address space is described by the mm_struct struct meaning that only one exists for each process and is shared between userspace threads. 这个链接也指出只有线程才拥有相同的地址空间 Modern virtual memory operating systems generally have a flat memory model and not a segme
260 2022-07-19
编程技术问答社区
linux - 服务器操作系统用哪个系统比较好?求全方位的分析。
问 题 目前看中的有三种,CoreOS,CentOS,Ubuntu,这三种哪种比较好? 或者有更好的,求推荐。 解决方案 CentOS 官方定义为Community Enterprise Operating System,中文意思是:社区企业操作系统 Debian 官方定义为 通用操作系统 Ubuntu 官方定义为 全球领先的用于个人电脑、平板及手机的操作系统 CoreOS是一个基于Linux 内核的轻量级操作系统,为了计算机集群的基础设施建设而生如Docker 你问我选择的什么,我一直用的CentOS
236 2022-07-17
编程技术问答社区
操作系统 - 在Windows上打开QQ, 会为他分配多大虚拟空间?
问 题 查阅相关资料,了解一个进程最大虚拟内存在32位Windows上为2G,64位为8T。 那么用户开启一个QQ或者浏览器在64位Windows上,就直接分配8T虚拟空间吗? 如果是,为什么要分这么大?那么他的映射表(虚拟空间和物理空间)上该怎么写?因为我们的物理内存基本是4-16G,并且新打开进程仍然要分配这么大吗? 如果不是,那是由什么决定的,如果不够了怎么办? 多谢~ 解决方案 是的,分配2G/8T。 注意,分配的是虚拟地址空间,不是虚拟空间; 为什么分配这么大?这是windows给出的承诺,向应用程序承诺,在物理内存足够大的情况下,我能够提供给你这么大的地址空间(注意这里的用词是地址空间,意思是有允许其内存寻址最多到8T这个数字) 当然,虚拟内存空间地址是一回事,实际空间是另一回事。 之前说了,虚拟空间地址只是承诺能够寻址,并非真的分配了空间;当应用程序真的申请了地址空间内能访问的内存时,windows才会开始把被访问的内存页映
260 2022-07-17
编程技术问答社区
操作系统 - 关于Windows中W32时间校正程序的问题
问 题 Windows中W32TIME时间校正程序可以在注册表中修改时间间隔。 假设在注册表中设置时间间隔为5分钟,此时修改本地时间,5分钟后自动校正。 目前到这里都没问题,但是因为这一次校正成功,我继续恶意修改本地时间, 我们打开右下角的时间,打开Internet时间发现,时间校正的间隔就不再是5分钟,可能是20分钟,30分钟,1天。 这个问题是微软刻意设置的还是我本机的问题? 另外这个W32TIME程序在服务中打开常常处于停止状态,设置为自动并手动启动之后,经过一段时间又会变成停止状态。 这个问题有没有具体的文档说明,https://technet.microsoft.com/zh-cn/library/cc773263.aspx。这个链接并没有关于参数SpecialPollInterval的太多说明,只说了默认值为1小时。 解决方案 找到原因,WINDOWS系统对时间同步设有具体的同步频率控制的机制。 也就是说假设45分钟同步一次,成功三次后,下一次同步就是一天之后。(
112 2022-07-17
编程技术问答社区
c - singal()系统调用第二个参数类型不匹配的问题?
#include #include #include int catch(int sig); int main(void) { signal(SIGINT, catch); /* 将 SIGINT 信号与 catch 函数关联 */ printf("in main function\n"); sleep(10); printf("end\n"); return 0; } int catch(int sig) { printf("Catch succeed!\n"); return 1; } 这段代码在Linux环境下编译的时候,报了一个错误: 提示说第二参数需要一个__sighandler_t类型的参数,我不是很明白要怎么改? 请问前辈们我应该改哪些地方?如何修改?
200 2022-07-17
编程技术问答社区
c - 关于 shell 里面的 pipe 功能,这段代码看不懂什么意思,是否可以解释一下?
问 题 int p[2]; char *argv[2]; argv[0] = "wc"; argv[1] = 0; pipe(p); if(fork() == 0) { close(0); dup(p[0]); close(p[0]); close(p[1]); exec("/bin/wc", argv); } else { write(p[1], "hello world\n", 12); close(p[0]); close(p[1]); } 解决方案 pipe()函数参数是管道描述符数组(即你上面的p[2]),传入参数之后就可以操作这两个文件操作符。比如你的p[0]为管道读端,p[1]为管道写端。 if(fork()==0)是用来选择进程的,也就是if(fork()==0)接下来的是子进程的操作,else里的函数是父进程的操作。 dup()函数用于复制一个描述符,返回一个新的描述符,但是看你的代码
186 2022-07-17
编程技术问答社区
socket - Linux 的最大进程数大多是 32768,那么以 Linux 构建的服务器是使用哪些技术同时处理百万级的传入连接的呢?
问 题 RT。比如说一个工作在最前端的 web 服务器,总是需要有一个进程去监听一个固定端口的(比如 80 端口)。为了提高整个服务器的健壮度,服务器 accept 了一个连接之后,可以立刻 fork 出子进程来处理这个连接。 但是大型服务总有高并发的需求的,仅仅是简单的 fork 轻而易举就可以超过 32768 个进程了,求解?各个服务器在底层原理上,实际上是如何如理传入连接的呢? BTW:我知道可以使用单个或者少量进程然后简单进行 I/O 复用来处理服务,但是……嗯,我了解到的一切大型网站并不是这么简单处理的……但是我也找不出个具体的所以然来…… 170724-22:31 问题补充: 我的希望了解的是作为最底层的socket连接上第一个IP之后(通常是DNS第一层解析得到的IP),发生了什么事情呢? 因为不论上层理论是怎么样的,在所有的实现中,总会有第一个 TCP socket 连接到一个 IP,而这个 IP 应该是一个现实存在的操作系统上的一个进程。
202 2022-07-17
编程技术问答社区