linux系统安装、使用中的问题和clock_t计时问题

来源:互联网 发布:淘宝店铺的客服电话 编辑:程序博客网 时间:2024/06/06 02:58

1.windows下的安装ubuntu系统过程中,(使用easyBCD软件安装)出现如下错误


则要在分好/  /home  swap等空间后先卸载了ISOdevice,记得自己当时等这个界面出来后,点击返回和继续是没反应的,所以要在这个界面出来之前调出终端卸载,使用的指令是:sudo umount -l /isodevice  。为了查看这个被卸载了没有,可以再次输入这指令,则会显示:umount: /isodevice: not mouted   其界面则是:


   注意:其实这个错误在第一次安装ubuntu是不会出错的,一般是卸载完ubuntu系统后重新安装才会出现这种错误。

2.按Ctrl+alt+F(1...6)出来的tty终端,其小四角是省略了一些字母:


3.当进行过VNC远程控制时,要安装了一些图像界面后,导致登录时即使输入正确的密码,但是闪了一下有跳回输入密码的登录界面,这时要在tty里删除相应的文件先,在切换到登录界面就可以登录进行,不过这个是不治本的方法,其他的方法自己也不知道,基本指令是

1. 在tty终端里输入:cd  /home/yangdashi     (其中的yangdashi是我的用户名)

2.然后查看是否有.Xaut*文件,其一般开启了VNC服务后会在这里生成一个Xauthority的文件,其属性被

定义为root用户,所以我们自身的用户名就使用不了。所以要删除它,查看指令为:ls -al

3.接着输入: rm -rf  .Xaut*  

注意不要忽略了‘.’和‘*’


4.重新输入指令:ls -al可以看到Xauthority文件被删除了。故可以成功登陆了。

注意:如果我们删除上面的那个文件后还是出现循环登录,则可能是本机用户盘的内存不够,删除一些占用内存比较大的文件则可以登录


4,linux系统的一些常识:



5.关于在linux系统下使用clock_t的问题.

首先,我们需要理解linux系统下的时间系统有几种,其分别为:

(1) 实际运行时间(real time):从命令行执行到运行终止的消逝时间;
(2) 用户CPU时间(user CPU time):命令在用户态中执行时间的总和;
(3) 系统CPU时间(system CPU time):命令在系统核心态中执行时间的总和。

其中用户态和系统态的概念:

void testfork(){  if(0 = = fork()){  printf(“create new process success!\n”);  }  printf(“testfork ok\n”);  }  

2)特权级

熟悉Unix/Linux系统的人都知道,fork的工作实际上是以系统调用的方式完成相应功能的,具体的工作是由sys_fork负责实施。其实无论是不是Unix或者Linux,对于任何操作系统来说,创建一个新的进程都是属于核心功能,因为它要做很多底层细致地工作,消耗系统的物理资源,比如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录页表等等,这些显然不能随便让哪个程序就能去做,于是就自然引出特权级别的概念,显然,最关键性的权力必须由高特权级的程序来执行,这样才可以做到集中管理,减少有限资源的访问和使用冲突。

特权级显然是非常有效的管理和控制程序执行的手段,因此在硬件上对特权级做了很多支持,就Intel x86架构的CPU来说一共有0~3四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查,相关的概念有CPL、DPL和RPL,这里不再过多阐述。硬件已经提供了一套特权级使用的相关机制,软件自然就是好好利用的问题,这属于操作系统要做的事情,对于Unix/Linux来说,只使用了0级特权级和3级特权级。也就是说在Unix/Linux系统中,一条工作在0级特权级的指令具有了CPU能提供的最高权力,而一条工作在3级特权级的指令具有CPU提供的最低或者说最基本权力。

3)用户态和内核态

现在我们从特权级的调度来理解用户态和内核态就比较好理解了,当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;反之,当程序运行在0级特权级上时,就可以称之为运行在内核态。

虽然用户态下和内核态下工作的程序有很多差别,但最重要的差别就在于特权级的不同,即权力的不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序,比如上面例子中的testfork()就不能直接调用sys_fork(),因为前者是工作在用户态,属于用户态程序,而sys_fork()是工作在内核态,属于内核态程序。

当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态,比如testfork()最初运行在用户态进程下,当它调用fork()最终触发sys_fork()的执行时,就切换到了内核态。

2. 用户态和内核态的转换

1)用户态切换到内核态的3种方式

a. 系统调用

这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。

b. 异常

当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

c. 外围设备的中断

当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

总结:用户态与内核态主要是权限不同,有些执行权限必须要内核态才可以拥有。

  所以当你在linux下使用clock_t这个函数时,其返回的值跟我们在Windows下的返回值不同,其返回的CPU使用时间,其问题是:使用clock()函数计算出来的时间就为总的CPU时间。也就是说,clock函数不能区分用户空间和内核空间。

所以当我们需要计算我们自身某段程序的运行时间是需要使用gettimeofday函数。其例子如下:

 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/time.h> 4  5 /*struct timeval说明 6 strut timeval { . {! K( J, c4 ?' }$ _+ L& B0 P 7 long tv_sec; /* 秒数 */ ( r* A) \" h& k( j. a2 F4 R 8 long tv_usec; /* 微秒数 */ }*/10 int main()11 {12       struct timeval tpstart,tpend;13       float timeuse;14       gettimeofday(&tpstart,NULL);15       /* 程序代码 */16       gettimeofday(&tpend,NULL);17       timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;18       timeuse/=1000000;19       printf("Used Time:%f\n",timeuse);20       return 0;21 }





1 0
原创粉丝点击